package engine.net.datatype
{
	import flash.geom.Point;
	import engine.net.utils.PropertyData;
	import engine.net.utils.NetDataType;

	public class NetPacket
	{
		private var _dataArray		:Array;
		private var _dataPacket	:ByteArrayEx;
		
		
		public function NetPacket()
		{
			_dataArray	=	new Array();
			_dataPacket	=	null;
		}
		
		/**
		 * 写入整数 
		 * @param idata
		 * 
		 */		
		public function WriteInt(val:int):void
		{
			var sn_data:PropertyData = new PropertyData();
			sn_data.SetInt(val, NetDataType.DATATYPE_INT);
			_dataArray.push(sn_data);
		}
		
		/**
		 * 写入浮点数 
		 * @param fData
		 * 
		 */		
		public function WriteFloat(fData:Number):void
		{
			var sn_data:PropertyData = new PropertyData();
			sn_data.SetNumber(fData, NetDataType.DATATYPE_FLOAT);
			_dataArray.push(sn_data);
		}
		/**
		 * 字符串类型 
		 * @param strdata
		 * 
		 */		
		public function WriteString(strdata:String):void
		{
			var sn_data:PropertyData = new PropertyData();
			sn_data.SetString(strdata, NetDataType.DATATYPE_STRING);
			_dataArray.push(sn_data);
		}
		/**
		 * 宽字符 
		 * @param strdata
		 * 
		 */		
		public function WriteWString(strdata:String):void
		{
			var sn_data:PropertyData = new PropertyData();
			sn_data.SetString(strdata, NetDataType.DATATYPE_WIDESTR);
			_dataArray.push(sn_data);
		}
		/**
		 * obj   
		 * @param obj
		 * 
		 */		
		public function WriteObject(obj:Point):void
		{
			var sn_data:PropertyData = new PropertyData();
			sn_data.SetObj(obj, NetDataType.DATATYPE_OBJECT);
			_dataArray.push(sn_data);
		}
		
		public function get data():ByteArrayEx
		{
			if(_dataPacket == null)
			{
				_dataPacket 	= new ByteArrayEx();
				
				_dataPacket.writeCustom();				
				_dataPacket.writeShort(_dataArray.length);
				
				var tSize:uint	=	_dataArray.length;
				
				for (var i:uint = 0; i < tSize; i++)
				{
					var sn_data	:PropertyData = _dataArray[i];
					var dataint	:uint;
					var datanum	:Number;
					var datastr	:String;
					var dataobj	:Point;
					
					_dataPacket.writeByte(sn_data.GetType());					
					
					switch (sn_data.GetType())
					{
						case NetDataType.DATATYPE_INT:
						{
							dataint = sn_data.GetInt();
							_dataPacket.writeInt(dataint);
							break;
						}
						case NetDataType.DATATYPE_FLOAT:
						{
							datanum = sn_data.GetNumber();
							_dataPacket.writeFloat(datanum);
							break;
						}
						case NetDataType.DATATYPE_OBJECT:
						{
							dataobj = sn_data.GetObj();
							_dataPacket.writeObjectEx(dataobj);
							break;
						}
						case NetDataType.DATATYPE_STRING:
						{
							datastr = sn_data.GetString();
							_dataPacket.writeMultiByteEx(datastr);
							break;
						}
						case NetDataType.DATATYPE_WIDESTR:
						{
							datastr = sn_data.GetString();
							_dataPacket.writeWString(datastr);
							break;
						}
					}
				}
			}
			return _dataPacket;
		}
	}
}